﻿#include<algorithm>//sort是就不变
#include<array>
#include<cmath>
#include<deque>//双端队列，prio
#include<iostream>
#include<map>//映射
#include<queue>//队列prio
#include<set>//容器
#include<stack>//栈
#include<cstring>//substr,stoi
#include<utility>//pair
#include<vector>
#define MAXL 1000005
#define mod 1000000007
#define ll long long
//#define int long long
#define inf 1e9
//typedef pair<int, int>PII;
const int N = 500000;
#define IOS std::ios::sync_with_stdio(0);std::cout.tie(0);std::cin.tie(0);
using namespace std;

int i, j, k, n, m, t, sz[N + 50], res;

int main() {
	ios::sync_with_stdio(0); cin.tie(0);
	cin >> t;
	while (t--) 
	{
        cin >> n;
        map<pair<int, int>, int > mp;
        res = 0;
        vector<pair<int, int> > q;
        for (i = 1; i < n; i++)
        {
            cin >> j >> k;
           
            sz[j]++;
            sz[k]++;
            // 在映射 mp 中标记边 (j, k) 和 (k, j) 存在
            mp[{j, k}] = mp[{k, j}] = 1;
        }
        // 遍历从 1 到 n 的每个顶点
        for (i = 1; i <= n; i++)
            // 将顶点 i 的度数和顶点编号 i 作为一个对添加到向量 q 中
            q.push_back({ sz[i],i });
        // 对向量 q 进行降序排序，即度数大的顶点排在前面
        sort(q.rbegin(), q.rend());
        // 如果顶点数 n 大于等于 4，将向量 q 的大小调整为 4，只保留度数最大的 4 个顶点
        if (n >= 4)q.resize(4);
        // 遍历向量 q 中的每个元素，其中 a 是度数，b 是顶点编号
        for (auto [a, b] : q)
        {
            // 遍历从 1 到 n 的每个顶点 d
            for (int d = 1; d <= n; d++)
            {
                // 如果当前顶点 b 不等于顶点 d
                if (b != d)
                {
                    res = max(res, a + sz[d] - 1 - !!mp.count({ b,d }));
                }
            }
        }
        cout << res << '\n';
		for (i = 1; i <= n; i++)sz[i] = 0;
	}
}
//连通分量的数量增加了 deg−1，其中 deg是移除时移除的顶点的度数
//如果两个点相邻则结果在减一